#![feature(test)]

extern crate test;

use test::{black_box, Bencher};

use bio::alignment::distance::*;

use std::u32;

// 5,000 random nucleotides, GC content = .55
static STR_1: &[u8] = b"ATCTAACTATTCCCTGTGCCTTATGGGGGCCTGCGCTATCTGCCTGT\
CGAACCATAGGACTCGCGCCAGCGCGCAGGCTTGGATCGAGGTGAAATCTCCGGGGCCTAAGACCACGAGCGTCTGGCG\
TCTTGGCTAACCCCCCTACATGCTGTTATAGACAATCAGTGGAAACCCGGTGCCAGGGGGTGGAGTGACCTTAAGTCAG\
GGACGATATTAATCGGAAGGAGTATTCAACGCAATGAAGCCGCAGGGTTGGCGTGGGAATGGTGCTTCTGTCCAAGCAG\
GTAAGGGCATGAGGCCGCAACCGTCCCCCAAGCGTACAGGGTGCACTTTGCAACGATTTCGGAGTCCGGAGACTCGCTG\
TTTTCGAAATTTGCGCTCAAGGGCGGGTATTGAACCAGGCTTACGCCCAAGAACGTAGCAAGGTGACTCAAACAAGGTA\
CATCTTGCCCGCGTTTCACACGAATCAAGTTGGAGGTTATGGAGCATAGTAACACGTGGGCGGCCAGTGGTCGGTTGCT\
ACACCCCTGCCGCAACGTTGAAGGTCCCGGATTAGACTGGCTGGACCCATGCCGTGACACCCGTCACACTCCATTACCG\
TCTGCGGGTCACGGCTTGTTGTGGACTGGATTGCCATTCTCTCAGTGTATTACGCAGGCCGGCGCGCGGGTCCCATGTA\
AACCTGTCATAGCTTACCTGACTCTACTTGGAAGTGTGGCTAGGCCTTTGCCCACGCACCTGGTCGGTCCTCGTTTGCT\
TTTTAGGACCGGATGAACTACAGAGCGCTGCAAGAATCTCTACCTGCTTTACAAAGCGCTGGGTCCTACTCCAGCGGGA\
TGTTTTATCTAAACACGATGAGAGGAGTATTCGTCAGGCCACATGGCTTTCTTGTCCTGGTCGGATCCATCGTTGGCGC\
CCGACCCCCCCACTCCGTAGTGAGTTCTTCGTCCGAGCCATTGCATGCCAGATCGGCAGACAGATAGCGGATCCAGTAT\
ATCCCTGGAAGCTATAGACGCACAGGTTGGAATCCTAAGCGAAGTCGCGCGTCCGAACCCAGCTCTACTTTAGTGGCCA\
CGGGTTCTGGTCCCCCCGGGCCGCGGAACCGATTAGGGCCATGTACAACAATACTTATTAGTCACCTTTCAGACACGAT\
CTCCCTGCTCAGTGGTATATGGTTCCTGCTATAATTAGCCACCCTCATAAGTTGCACTACTTCTGCGACCCAAGTGCAC\
CCTTACCACGAAGACAGGATTGTCCGATCCCATACTGCGGCCTTGGCAGGGGGTTCGCAAGTCCCACCCCAAACGATGC\
TGAAGGCTCAGGTTACACAGGCACAAGTGCTATATACGCGAGTTCCCGCTCTTAACCTGGACCGAATGCGGGATCATGC\
ATCGTACCACTGTGTTCGTGTCATCTAGGACGGGCGCAAAGGATACATAGTTCAATCAAGAATACCTTGTATTATTGTA\
CACCTACCGGTCACCAGCCAACAATGTGCGGACGGCGTTGCGACTTGCTGGGCCTGATCTCACCGCCCTAGATACCGCA\
CACTGGGCAATACGAGGTAAAGCCAGTCACCCAGTGTCGATCAACAGCTGACGTAACGGTAAGAGGCTCACAAAATCGC\
ACCGCCGGCGTCCCCTGGGTATTTTACGTCAGCATCGGGTGGACTGGCATGAATCTTTACTCCCAGGCGGAAACGGGTG\
CGTGGACAAGCGAGCAGCAAACGAAAATTCCTGGCCTGCTTGGTGTCTCGTATCCCTCTTGGAGATCGAGGAAATGTTT\
CACGACCAAGGGAAAGGTCGCCCTACGAAATAGATTTGCGCTACTGTCCGCATAAGGAGTCCGGTGTAGCGAAGGATGA\
AGGCGACCCTAGGTAGCAACCGCCGGCTTCGGCGGTAAGGTATCACTCAGGAAGCAGGCACGGAAAGACACGGTCTAGC\
AGACCGTCTATCGGCTAGGTCAAATAGGGTGCTTTGATATCAGCATGTCCAGCCTTAGAATTCAGTTCAGCGCGCTGGT\
CTGGGTCGAGATAAAATCACCAGTACCCAAGACCAGGCGGGCTCGCCGCGTTGGCTAATCCTGGTACATCTTGTAATCA\
ATGTTCAGAAGAAAATCTGTGTTAGAGGGACGAGTCACCACGTACCAATAGCGACAACGATCGGTCGGACTATTCATCG\
TGGTGGTGACGCTCGGATTACGCGGGAAAGGTGCTTGTGTCCCGACAGGCTAGGATATAATGCTGAGGCGCTGCCCCAA\
CCGTTCAGCGTGGGGTTTGCTACAACTTCCGAGTGCTACGTGTGCGAGACCATGTTATGTATGCACAAGGCCGACAATA\
GGACGTAGCCTTCGAGTTAGTACGTAGCGTGGTCGCACAAGCACAGTAGATCCTCCCCGCGCATCCTATTTATTAAGTT\
AATTCTATAGCAATACGATCACATGCGGATGGGCAGTGGCCGGTAGTCACACGCCTACCGCGGTGCTCAATGACCGGGA\
CTAGAGAGGCGAAGATTATGGCGTGTGACCCGTTATGCTCGAGTTCGGTCAGAGCGTCATTGCGAGTAGTCGATTGCTT\
TCCCAATCTCCGAGCGATTTAGCGTGACAGCCCCAGGGAACCCACAAAATGCGATCGCAGTCCACCCGATCGTACACAG\
AAAGGAGGGTCCCCATACGCCGACGCACCTGTTCGCACGTCGTATGCATAAACGAGCCGCACGAACCAGAGAGCATAAA\
GAGGACCTCTAGCTCCTTTACAAAGTACAGGTTCGCCTGCCGCCGGGATGCCTTACCTAGACGCAATGACGGACGTATT\
CCTCTGGCCTCAACGGTTCCTGCTTCCGCTGGGATCCAAGATTGGCGGCCGAAGCCGCCTTTCCAAAGTGAGTCCTTCG\
TCTGTGACTAACTGTGCCAGATCGTCTTGCAAACTCCCGATCCAGTTTAACTCACCAAACTATAGCCGTACAGACCCAA\
ATCTTAAGTCATATCACGCGACTAGCCTCTGCTCAATTTCTGTGCTCAAGGGTTTTGGTCCGCCCGAGCGGTGCAGCCG\
ATTAGGACCATCTAATGCACTTGTTACAAGACTTCTTTTAAACACTTTCTTCCTGCCCAGTGGCGGATGATAATGGTTG\
TTGCCAGCCGGCGTGGAAGGTAACAGCACCGGTGCGAGCCTAATGTGCCGTCTCCACCAACACAGGGCTGTCCGGTCGT\
ATAATAGGACTCCGCAATGGGGTTAGCAAGTGGCAGCCTAAACGATGTCGGGGACTCGCGATGTACATGCTCTGGTTCA\
ATACATACGTGACCCGGCAGTTATCCTGCATCGGAACGTCAATCGTGCATCGGGCCAGCGTAATCGTGTCATCTGGGAG\
GCGGCCGTAGGATAAATAATTCAATAAAGATGTCGTTTTGCTAGTATACGCCTAGGCGTCACCCGCCATCTCTGTGCAG\
GTGGGCCGACGAGACACTGCCCCTGATTTCTCCGCTACTAATAGCACACACGGGGCAATACCAGCACAAGCCAGTCTCG\
CGGGAACGCTCGTCAGCATACGAAAGAGCTTGAGGCACGCCAATTCGCACTGTCGGGGTCGCTTGGGTGTTTTGCACTA\
CCGTCAGGTACGCTAGTATGCGTCCTTCCTTCCAGGGGTATGTGGCTGCGTGGTCAAAAGTGCGGCATTCGTATTTGCT\
CCCCGTGCTTGCTCTCACGAACTTGACCTGGAGATCAAGGAGATGCTTCTTGTGGAACCGGACAGCGCATCAACGCAAC\
GGATCTACGTTACAGCGTGCATAGCGAGAACGGAGTTGCCGACGACGAAAGCGACACTGGGATCTGTCCGTCGTCATTC\
GCGGAAAGCATCCGCTCACGAGGCGGACACTGATTGACACGGTTTTGCAGAAGGTTAGGGGAATAGGTCAAATTGAGTG\
GCTTAAAAACGCTATGTCTGGGATTAAAGTGTAGTAAACTGCGGTCAACGGAGACGGTTTTAAGACAGGAGTTCGCAAA\
ACCAGGCGGGGTCGCCACGACGGCTATTCCTGGTGGTTTAGGCGTACAATGTCCTGAAGAATATTTAAGAAAGAAGCAC\
CCCTCGTCGCCTAGAATTACCTACCGCGGTCGACCATACCTTCGATTGTCGCGCCCACCCTCCCATTAGTCGGCAGAGG\
TGGTTGTGTTGCGATAGCCCAGCATGATATCCTAAGGCGTTACGCCGATGGATATCCCACGGAATTGCCATAGGCGCTG\
AACGCTACACGGACGATACGAACTTATGTATGGAGCGGGTCATCGAAAGGTCATACCCTTGTAGTTAACATGTAGCCCG\
GCCCTATTAGTACAGCAGTGCCTTGAGCGGCATTCTCATTATTAAGTTTTCTCTACAGCCAAACGACCAAGTGCACTTC\
CGCGGAGCGCGGTGGAGACTCGTCCACCCGGCAGCTCTGTAATAGGGACTAAAAGAGTGATGATAATCATGAGTGCCGC\
GTTATGGTGGTGTCGGAACAGAGCGGTCTTACGGCCAGTCGTATCCCTTCTCGAGTTCCGTCCGGTTAAGCGTGACACT\
CCCAGTGTACCCGCAAACCGTGATGGCTGTGCTTGGGGTCAATCGCATGTAGGATGGTCTCCAGACACCGGGGCACCAG\
TTTTCACGCCCAAAGCATAAACGACGAGCAGTCATGAGAGTCTTAGAACTGGACGTGCCGTTTCTCTGCGAACAACACC\
TCGAGCTGTACCGTTGTTGCGCTGCCTAGATGCAGTGCCGCTCCTATCACATTTGCCTCGACGACTGCCGCCTTCGCTG\
TTTCCCTAGACACTCAACAGTAAGCGCCTTTTGTAGGCAGGGGCACCCCCTGTCAGTGGCTGCGCCAAAACGTCTTCGG\
ATCCCCTTGTCCAATCAAACTGACCGAATTCTTTCATTTAAGACCCTAATATGACATCATTAGTGACTAAATGCCACTC\
CCAAAATTCTGCCCAGAAGCGTTTAAGTTCGCCCCACTAAAGTTGTCTAAAACGA";
// 5,000 random nucleotides, GC content = .45
static STR_2: &[u8] = b"CTAAAGTGGCGAAATTTATGGTGTGTGACCCGTTATGCTCCATTTCG\
GTCAGTGGGTCATTGCTAGTAGTCGATTGCATTGTCATTCTCCGAGTGATTTAGCGTGACAGCCGCAGGGAACCCATAA\
AATGTAATCGTAGTCCATCTGATCGTACTTAGAAATGAAGGTCCCCTTTTACCCACGCACCTGTTTACTCGTCGTTTGC\
TTTTAAGAACCGCACGAACCACAGAGCATAAAGAGAACCTCTAGTTCCTTTACAAAGTACTGGTTCCCTTTTCAGCAAG\
ATGCCTTATCTAAATGCAATGACAGACGTATTCCTCAGGCCACATCGCTTCCTACTTTCGCTGGGATCCATCATTGGCA\
GCTGAAACCGCCATTCCATAGTGAGTCCTTCGTCTGTGTCTTTCTGTGCCAAATCGTCTAGCAAATTGCTGATCCAGTT\
TATCTCACGAAATTATAGTCATACAGACCGAAATTTTAAATCAAATCACGCGACTAGGCTCAGCTTTATTTTAGTGGTC\
ATGGGTTTTGGTCCGCCCGAGCGGTGCAACCGATTAGGACCATGTAAAACATTTGTTACAAGTCTTCTTTTAAATACAA\
TCTTCCTGCTCAGTAGCGCATGATTATCGTTGTTGCTAGCCAGTGTGGTAAGTAACAGCACCACTGCGAGCCTAATGTG\
CCCTTTCCACGAACACAAGGCTATCCGATCCTATATTAGGATTCCGCAATGGGGTTAGCAAATCGCACCCTAAACGATA\
TTGAAGACTTGCGATGTACATGCTTTGGTACAATACATACGTGTTCCAGTTGTTATCCTGTATCGGAACTTCAATTATG\
CATCGCACCAGCATATTCATGTCATCTAGGAAGAGCGCGTAGGATAAATAATTCAATTAAGATGTCGTTATGCTAGTAT\
ACGTCTACCCGTCACCGGCCATCTGTGTGCAGATGGGGCGACGAGTTATTGACCCTGATTTCTCCACTTCTAATACCAC\
ACACTGGGCAATACGAGCTCAAGCTAGTCTCGCAGTAACGCTCATCAGCTAACGAAAGAGTTAAAGGCTCGCTAATTCG\
CACTGTCAGGGTCTCTTGGGTGTTTTGCACTAGCGTCAGGTAGGCTAGTATGTGTTTTTCCTTCCAGAGGTATGTGGCT\
GCGTGGTCAAATGTGCAGCATACGTATTTGCTCGACGTGTTTAGTCTCTCATACTTCTCCTGGAGATCAAGGAAATGTT\
TCTTGTCCAAGTGGACAACGGTTCTACGGAATGGATCTACGTTACTGCCTGCATAAAGAAAACGGAGTTGCTAAGGACG\
AAAGCGACTTTAGGTTCTAACTGTTGACTTTGGCGGAAAAGTTTCATTCAGGAAGCAGACACTGATTGACACGGTTTAG\
CAGAACGTTTGAGGATTAGGTTAAATTGAGTGGTTTAATATTGGTATGTCTGGGATTAAAATATAGTATAGTGTGTTAA\
TCGGAGACGAATTAAAGACACGAGTTCCCAAAATCAAGCGGGCTCATTACAACGGTTAATCCTGGTAGTTTACGTGAAC\
AATGTTCTGAAGAAAATTTATGAAAAAAGGACCCGTCATCGCCTACAATTACCTACAACGGTCGACCATACCTTCGATT\
ATCGTGGCCACTCTCGGATTACACGGCAGAGGTGGTTGTGTTCCGATAGGCCAGTATATTATTCTAAGGCGTTACCCTA\
ATCATTTTTCATCGGATTTGCTATAGCCCTTGAACGCTACATGCACGAAACCAAATTATGTATACACTGGGTCATCAAT\
AGGATATAGTCTTGTAGTTAACATGTAGCCCGGCCGTATTAGTACAGTAGAGCCTTCATTGACATTCTGTTTATTAAAT\
TATTTCTACAGCAAAACGATCATATGCAAATCCACAGTGCGCGATAGAGATACATTCACTCGGCTGCTCTGTAATAGGG\
ACTAAAAAAGTGATGATTATCATGAGTGCCCCGTTATGGTCGTGTTCGATCAGAGCGCTCTTACGAGCAGTCGTATACT\
TTCTCGAATTCCGTGCAGTTAAGCGTGACAGTCCCAGTGAACCCACAAAACGTGATGGCAGTCCATGCAATCATACGCA\
AGAAGGATGGTCTCCAGACACCGGCGCACCAGTTTTCACGCCGAAAGCATAAACGAGGAGCACAAATGAAAGTGTTTGA\
ACTGGACCTGTAGTTTCTCTACGAAAAATACCTTGAGCTGTTGCGTTGTTGCGCTGCCTAGATGCAGTGTTGCACATAT\
CACTTTTGCTTCAACGACTGCTGCTTTCGCTGTAACCCTAGACAGACAACAATAAGCGCTTTTTGTAGGCAAGAGCTCC\
GCCTATGACTAACTGCGCCAAAACATCTTCCAATCCCCTTATCCAATTTAATTCATCGAATTCTTACAATTTAGACCCT\
AATATCACATCATTAGACATTAATTGCCTCTGCCAAAATTCTGTCTACAAATGTTTTAGTTCGCTCCAGTAAAGTTGTT\
AATAACGACTACTAAATCCGCATGTTACGGGATTTCTTATTAATTCTTTTTTCGTAAGGAACAGCGGATCTTAATGGAT\
GGCGCCAGGTGGTATGGAAGCTAATAGCGCGGGTGAGAGGGTAATTAGCCGTCTTCACCAACACAACGCTATCGGGTCA\
TACTATAAGATTCCACAATGCGACTACTTATAAGATGTCTTAACGGTATCCGCAACTTGTGATGTGCCTACTATGCTTA\
AATGCATATCTCGCTCAGTAACTTTCCAATATGAGAGCATCAATTGTAGATCGGGCCGAGATAATCATGTCGTCACGGA\
ACTTATTGTAAGAGTAATAATTTAAAAGAGATGTCAGTTTGCTGGTTCACGTAAAGGTTCCTCACACTACCTCTAAATA\
AGTGAGCGGTCGTGACATTATCCCTGATTTTCTCACTACTATTAGTACTCACGACACAATTCTACCACAGCCTTGTTTC\
GCCAGAATGCCAGTCAGCATAAAGAAGAGCTCAAGGCAGGTCAACTCGCATTGTGAGAGTTACATGAACGTTCGGCACT\
ACCGACACGAACCTCAGTTAGCGTACATCCTACCAGAGGTCTGTGGCCCCGTGGTCAAAAGTGCGGATTTCGTATTTGC\
TGCTCGTCAGTACTTTCAGAATCATGACCTGCACGGTAAAAAGACGCTTATTATGGAGTTCGACATGGCAATAACGCGA\
CGAATCTACGTCATGACGAGAATAGTATAAACAAAACTGCTGACGGCAGAAGCGTCAAAGAAGTCTGTAAATTGTTATT\
CGCGAAAAACATCCGTCTCCGTGGGGGATAATCACCGACGCCATTTTATAGAAGCCTAGGGGAACAGATTGGTTTAATT\
AGCTTAAGAAAGTAAATTCTGGGATTATACTGTAGTAATCACTAATTTACGGTGAGGGTTTTATGGCGGATTTTTACAA\
ATTCAAACCAGGTGATTTCAACAAATTTTGTTGACGATTTAGGCGCACTATCCCCTAAACTACAAATTAAAAAATAGCG\
TTCCTTGACGGCTAGAATTACTTACCGGCCTTCACCATACCTTCGATATTCGCGCCCACTCTCCCATTAATCCGTACAA\
GTGGATGTAATGCGATTGTCCGCTAAGATATTCTAACGTGTAACGTAGATAAGTATTTTACAGAGTTGCCGTACGCGTT\
GAACACTTCACAGATGATAGGAATTTGCGTATAGAGCGTGTTATTGAGGAGTTATACACCCGTAGACTACAATGGGCCC\
AACTCAATCAGAACTCGAGTGCCTTGAATAACATACTCATCACTAAACATTCTCAACAATCAATCGAGCAAGTCCATTA\
TCAACGAGTGTGTTGCAGTTTTATTCTCTTGCCAGCATTGTAATAGGCACTAAAAGAATGATGATAGTCATGAGTACTG\
AGCTAAGACGGCGTCGATGCATAGCGGACTTTCGGTCAATCACAATTCCTCACGAGACTCGTCCTGTTGAGCGTATCAC\
TCTCAATGTACAAGCAACCCAAGAAGGCTGTGCCTGGACTCAACTGGATGCAGGATGAACTCCAGACACGGGGTCACTA\
CTCTTCATACATAAAGCAAGAACGTCGAACAGTCATGAAAGTCTTAGTACCGCACGTACCATCTTACTGTGAATATTGC\
TTGAAGCTGTACCGTTATTGGGGGGCAAAGATGAAGTTCTCTTCTTTTCATAATTGTACTGACGACAGTCGTGTTCTCG\
GTTTCTTCAAAGGTTAAAGAATAAAGGCTTATTGTAGGCAGAGGAACGCCCTTTTAGTGGCTGGCGTTAAGTATCTTCG\
GACCCCCTTGTCTATCCAGATTAATCGAATTCTCTCATTTAGGACCTTAGTAAGTCATCATTGGTATTTGAATGCGACC\
TTGAAGAAACCGCTTAAAAATGTCAATGGTTGATCCACTAAACTTCATTTAATTAACTCCTAAATCAGCGCGATAGGCT\
ATTAGAGGTTTAATTTTGTATAGCAAGGTACTTCCGATCTTAATGAATGGCCGGAAAAGGTACGGACGCGATATGCGAG\
GGTGAAAGGGCAAATAGACAGGTTCGTCTTTGTCACGCTAGGAGGCAATTCTATAAGAATGCATATTGCATCGATACAT\
AAAATGTCTCGATCGCATGCGCAATTTGTGAAGTGTCTATTATCCCTAAGCCCATTTCCCGCATAATAACCCCTGATTG\
TATCCGCATTTGATGCTACCCAGGTTGAGTTAGCGTCGAGCTCGCGGAACTTATTGCATGAGTAGAGTTGAGTAAGAGC\
TGTTAGATGGCTCGCTGAACTAATAGTTGTCCACAGAACGTCAAGATTAGAAAACGGTTGTAGCATTATCGGAGGTTCT\
CTAACTACTATCAATACCCGTGTCTTGACTCTGCTGCGGCTACCTATCGCCTGAAAACCAGTTGGTGTTAAGGGATGCT\
CTGTCCAGGACGCCACATGTAGTGAAACTTACATGTTCGTTGGGTTCACCCGACT";
// 5,000 random nucleotides, GC content = .0
static STR_3: &[u8] = b"AATTTAAAATAAAATTATTTTAAAAAATAAATTTTTATTATTTTTTT\
TATAAATAATTTAATATATTAAAAATATAAAATTAATTTTTTTAATAATTATAAATTAAAAATTTAAAATATTATTTAA\
AATATAAATTTAATAATATATATTTTAATTATTTAATTATTTTTTATATTTTATAAAAATTTATATTATTTATTTATTA\
AATTATAAAATTTATATTAATATATAAATTTAAATTAAAATAAAATTTTTAAAATTTAAAATTATAAATATTTAATATT\
TTAATTAATTTTTATATATATTATTATAAATAATTAATAAAAATTTTATATTAAAAAATAAAATAATTTTAAATTAAAA\
ATAATATTAATTAAAAAAAATATTTAATATAATAAAATTATAAAATTAATATAAAAATAATATTTTTATTTAAATAAAT\
AAAAATATAATATTATAATTATTTTTTAAATATATAAAATATATTTTATAATAATTTTTAAATTTAAAAATTTATTATT\
TTTAAAATTTATATTTAAAAATAAATATTAAATTAAATTTATATTTAAAAATATAATAAAATAATTTAAATAAAATATA\
TTTTATTTATATTTTATATAAATTAAATTAAAAATTATAAAATATAATAATATATAAATAATTAATAATTAATTATTAT\
ATATTTATTATAATATTAAAAATTTTAAATTAAATTAATAAAATTTATATTATAATATTTATTATATTTTATTATTATT\
TATAAATTATAATTTATTATAAATTAAATTATTATTTTTTTAATATATTATAAAAATTAATATATAAATTTTATATAAA\
TTAATTATAATTTATTTAATTTTATTTAAAAATATAATTTTATTTTTATTTATATATTTAATTAATTTTTATTTATTTT\
TTAAAATTAAATAAATTATAAAATATTATAAAAATTTTTATTTATTTTATAAAATATTAAATTTTTTTTTAATAAAATA\
TTTTATTTAAATATAATAAAAAAAATATTTTTTAAATTATATAATTTTTTTATTTTATTTAAATTTATTATTAATAATT\
AATATTTTTATTTTATAATAAATTTTTTATTTAAATTATTATATATTAAATTAATTAATAAATAATAAATTTAATATAT\
TTTTAAAAATTATAAATATATAAATTAAAATTTTAAATAAAATTATATATTTAAATTTAATTTTATTTTAATAATTATA\
AATTTTAATTTTTTTAAATTATATAATTAATTAAAATTATATAAAATAATATTTATAAATTATTTTTTAAATATAATTT\
TTTTATTTAATAATATATAATTTTTATTATAATTAATTATTTTTATAAATAATATTATTTTTATAATTTAAATATATTT\
TTTTTATAAATATAAAATTATTTAATTTTATATTATAATTTTAATAAAAAATTTATAAATTTTATTTTAAATAATATTA\
AAAATTTAAATTATATAAATATAAATATTATATATATAAATTTTTATTTTTAATTTAAATTAAAAATATAATTATATAT\
TATATTATTATATTTATATTATTTAAAATAAATATATAAAATATATAATTTAATTAAAAATATTTTATATTATTATATA\
TTTATTAATTATTAATTAATAATATATAAATAATATTATAATTTATTAAATTTAATTTTATTATTTTAAATATTATATA\
TTAAATAATATAAAATAAAATTAATTATTTAATAATAATTATTAATTAATATAATAATAAAAAATTTATTAAATTATAT\
TATTAATATTTTTTAAATATTTTATATTAATATTAAATAAATTAATATAAATTTTTATTTTTAAAAAAAAATAAATATA\
TAAATAAATAAATAATAAATAAAAATTTTTAATATATTTAATATTTTATATTTTTTTTAAAAATTAAAAAAATATTTTA\
TAATTAAAAAAAAAATTATTTTATAAAATAAATTTATATTATTATTTATATAAAAAATTTAATATAATAAAAAATAAAA\
ATAATTTTAAATAATAATTATTAATTTTAATAATAAAATATTATTTAAAAAATAAATATAAAAAAATATAATTTAATAA\
ATTATTTAATAATTAAATTAAATAAAATATTTTAATATTAATATATTTAATTTTAAAATTTAATTTAATATATTAATTT\
AAATTAAAATAAAATTATTAATATTTAAAATTAAATAAATTTATTATATTAATTAATTTTAATATATTTTATAAATAAT\
ATTTAAAAAAAAATTTATATTAAAAAAATAAATTATTATATATTAATAATAATAATAATTAATTATATTATTTATTATT\
ATAATAATATTTAAATTATATAAAAAAAATATTTATATTTTAATAAATTAAAATATAATTTTAAAATATTATTTTAATT\
ATTTAATATAAAATTTATTATAATTTTTAAATATTATATATATAAAATTATATTATATATATATAAAATTAATAATAAA\
ATATAATTTTAAAATTAATATATAATATAATTATATAAATATAATAAATTTTTTTTATATATTTTATTTATTAAATTAA\
TTTTATAATAATATAATTATATATAAATAAATAATAATTAATAAATATATATTTATTTTATTATTTAATAATTAAAATT\
AAAAAAATAAAAATTATAATATATAATTTATTATATTTAAATTTAATTAAAATATTATTATAAATAATTAATTATTTTT\
TTAATTTTTAAATAATTAAATATAATAATTTTAAAAAATTTATAAAATATAATTATAATTTATTTAATTATATATAAAA\
AAAAAAATTTTTATATATTAATATATTAATTTATATATTATATATATAAATAAATTATATAAATTAAAAAATATAAAAA\
AAATTTTTAATTTTTTTATAAAAAATAAATTTATTTATTATTAAAATATTTTATTTAAATATAATAATAAATATATTTT\
TTTTATTTTAATAATTTTTATTTTTATTAAAATTTAAAATTAATAATTAAAATTATTTTTTTAAAATAAATTTTTTATT\
TATAATTAATTATATTAAATTATTTTATAAATTTTTAATTTAATTTAATTTATTAAATTATAATTATATAAATTTTAAT\
TTTATATTATATTATATAATTAATTTTTATTTAATTTTTATATTTAAAAATTTTAATTTATTTAAATAATATTATTAAT\
TAAAATTATTAAATATATTTATTATAAAATTTTTTTTAAATATTTTTTTTTTAAATAATAATAAATATTAATAAATATT\
ATTAATTAATATAAAAATTAATAATATTAATAAAAATTTAATATATTATTTTTATTAATATAAAATTATTTAATTATAT\
AATAAAATTTTATAATAAAATTAATAAAAAATAATTTAAATAATATTAAAAATTTATAATATATATATTTTAATTTAAT\
ATATATATAATTTAATAATTATTTTATATTAAAATATTAATTATATATTAAATTAATATAATTATATTATTTTAAAAAT\
AATTATAAAATAAATAATTTAATAAAAATATTATTTTATTAATATATATTTAAATATTATATATTATTTTTATATAAAT\
AAATTAATAAAATATTATTTTTAATTTTTTTATTATTAATAATATTTATAAAATAATATTAATATAAATTAATTTTATA\
AAAATATTTATTAATATATAAAAAAATTTAAAATATATTAATTTATATTATTAAAATTATTTAAATATTTTATATTATT\
ATTAAATATATTAATATATATTTTTTTTATTAAAAATTTATAATTATATAATTAAAAATATAATTTTTATATTTATTTT\
TTATATTTATTTTTATAAATTTAATTTAAATATTAAAAAAATATTTTTTATAAAATTTAATAATATAATAATATAATAA\
ATTTATATTATAATATATATAATAAAAATAAAATTATTAATAATAAAAATAATATTAAAATTTATTTATTATTATTTAT\
AAAAAATATTTATTTTTAAAATAAATATTAATTAATATAATTTTATAAAAAATTAAAAAAATAAATTAAATTAAATAAT\
TTAAAAATATTAAATTTAAAATTATAATATAATAATTTATAATTAATAAAAATAATTTTAAAATAAATATTTATAAAAT\
TAAATAAAATTATTTTAATAATTATTATTAATAATTTAAATATATAATATTTTAAAAAATAATTAAAAAAAAAATATTT\
TTTATTATTTAAAATTATTTATTATAATTTATTATATTTTTAATTATTATATTTATTTTTTTATTAATTAATAAAAATA\
ATTATATTATAATAATTTAATATAATATTTTAAAATATTATATTAATAAATATTTTATAAAATTATTATAAATATTAAA\
TATTATATAAATAATATAAATTTATATATAAAATAAATTATTAAAAAATTATATTTTTATAATTAATATTTAATTTAAT\
TTTATTAATATAATAATATTTTAAATAATATTTTTATTATTAAATTTTTTTTATAATTAAATAATTAAATATATTTTTA\
AAAAATATAATAAAAATTTATTTATTTATTAATATTATAATAAAAATTAAAAAAATAATAATAATTATAAATATTATAT\
TAAAATAATATTAAAATAAAATAATTTTATAATTAATTATATTTTTTTTTAAATTTTATTTAATTAAATATAATATTTT\
TAATATATTTATAAATTATAATAATTATATTTAAAATTAATTATATATAAAATAATTTTTAAATATTAAAATATTAATT\
TTTATATTTAAAATATAAATAATAAATAATTATAAAAATTTTAATATTAAATATATTATTTTTTTATAAATAATATTTT\
AAATTATATTATTATTATATTATTTAAATATAATATTATTTTTATTATATTTATTTTAATAATTATTATTTTTATAATT\
TTTTTAAATATTTAATAATAAATATTTTTTATAAATAAAAATATTTTTTATTAAT";
// 5,000 random nucleotides, GC content = 1.
static STR_4: &[u8] = b"GGGGGGGGGGCGCGCGGCCCCCCGCCGGGGCGCCCCCGCGCGCGGCG\
CGGCCGCGCGCCCCGCGGGGGCGGCGGGCGCGCCGGGCGCCCCGCGGGCGGCGGGGGCCCGGGCGGGGGGCGCGCGGCC\
GGGGGCCGGCGCGGGCGCGGGCCGCGGCGGCGCCGGCCCGGCCGCGGCCCGCGCGCCCCGGGCGGCGCGCCCGCCCCGG\
CCGGCCCCCGGCGGCCCGCGGGGCGGCCCGGCCGCCGGCGGCCGCCCGGCGGCCCCGGCCCCCCGCCGGCGCCGCGGCG\
GCCCCCGGGGGGCCGGCCGCGCCCGCCGGCGCGGGGGCGGCGCGGCGCCGGCGGGCGGCGGGCCCCCGGCCGGCCGCGG\
CCCCCCGGGGGGCGGGCCCCGCGGCGCGCGCCGCCCCGCGCGCGCGGGCGGCCCGGGCGGGCCCGGCCCGGGCCCGGCC\
GGCCCCCGCGCGGGCCCGGGGCCGGGGGCGGCGGCCCCCCGGGCGCGGGGCGGGGGCGCCGGGCGGCCGGGGGGCCCGC\
GGCGCCCCGGGCGCCGGCCCGCCCGGGCCGCCGCCCGGGGCCGCGCCGCCCCGGGGGGGGGGCGCCGGGGGCCCCCCCC\
CCCGGCGGCCGGGCCCGCGGGGGCCGCGGGGCCGGCCCCCCCGGCGGCCGGGGGGCGGGGGCCCGCCGCGCGGGCCGGG\
GCGCCCGCCCGGCGGCCCGCGCCCCGGGCGCCCGGCCCCCCCCGCCGCCCCGGGCGGGCCCGCCCCCCCCGCCCGCCGG\
CCCGCGGGGCCCGCGCCGGCGCGCGGGCGCGGCCCGGGGGGGGGCGCCCGGGGCCGGGGGCGGCCGGCGCCCCGCGCCC\
CGCCCGGCCCCCCCGCGCGCCGCCGCGGCGGGCCGGCGGGGGCCCGGCGCCGGGCGGCGGGGCGCCCCCGGCCCCGGCG\
GGGGGCCGGGGGGGGCGCGCGCGCGGCGCGGGGGGGCCGGGGGGCCGGCGGGGGGGCCCCCCCCCCGCCCGCCGGGGGG\
CGGGCGCGGGGCGGCGGCCGCCGCGCCGGCGCGCGGGGCGCGCCCGGCGGCCGCCCGGGGCGCCGGGCGCCCGCCGCCC\
CCGGGGCCGCCCCCCGGGCGCGGGCGCCGGGCCGGGCCCGCGCCCGGGGCCGCCGCGGGCGGGCCCGGGCCGGGCGCGC\
CGCGCCCGCCGCGCGGGCGGGGCCGGCCGGGGGCCGCCGGGCGCGCCGCCGCGCGGGCGGCCGCCGGCGGGCCGCCGGG\
CCCGGGGGGCGGCGCCGGCGCCCCCGGGGGGCCCCGGCCGGGCGCGGGCCGCGGCGCCCGCGCCGCCCCGCGGCCGCCC\
GCGGCCCGGGGCCCGGCCCGCGCCGGGCCGCCGCCCCCCCGGGGCGCCGCGCGGGGCGGCGCGCGCGCCCCGCGCGGGC\
CCGCCGCGGCCCGCCCGGGGCCGGCCGGGGGCGCGGCCGGGCCCCGGCCCGCGCGCCCGGCCGGCCCGCGCCCGGCCCC\
CGGGGCCCGGCGGCCCCCGGGGCGCCGCGGGGCCCGCGGCCCGCCCCGCCGGGCGCCGGGCCCCGCCCCGGCGGGGCCC\
CCCGCCCGGGGGCGCCGGGGGGGGCGCCCGCCGGGCCGCGCGGCCCCCGCGCCCCGGCCGGGGGGGCCGCCGGCGCCCG\
GCCCCCGGGCCCCGCGGCGGGCCCCGCGCGCGGGCCGCCGCGCGCGGGGCCGGCGGGCCGGCGGGGGGCGCGGGGCGCC\
CCCGGGCGCGGCGGGCGGGCGGCCCGGCGCCCCGGGCGCGGCCGCGCGCCCGGGCCCGGCCCCGCCCCGGGGGCCCCGG\
GCCCCGGCGCCCGCGGGCCGCGGGGCCGGCCGGGGGGGCGCGCGGCGGCGCCCGCCGGCCGCCCCCGGGCCGCGGCCCC\
CCGCCCCGCCGGGGCCCGGCCCCCGCCGCGGCCGGCCCCCCCCGCGGGCCGCGCCGCCCCGGCGCCCCGGCCGCGCCCC\
CGCCGCGGGGGCGGGCCCGCCCGCCCCCGCGCCCCGGCGCCGGCGGGGGGCCCGCGCGCCCCGCGCGGGGCGCCGCCGG\
GGCCCCGGGCCCCCGGGCGGCGGGGGCCCCGGGCGCGGGCCCCCGCCCGCGGCCCGGCCCGGGCGCGGGCCCCCGCGCC\
GCCCCGCCGGGCCCGCCCCGCGCGGGGCGGGCGCGGGGCGCGCCCGGCCCGGCCCCCGGCGCCCCGCGCCGCCGCGCGC\
CCGCCGGCCGCCGGCCGGCGGCGCGGGGGCGGCGCCGCGGCCCCCGGGGCCCGGCCCGGCCGGCCCGGGCGCGGCGCCG\
CGGGCGGCGCGGGGCGGCGGCGGGCGCCCGGCGCCGGGCGGCGCCCGGCCCGGCGGCGGGGGGGCCGCGCGGCGCGCCC\
GGCCGCGCGCCCGGGGCGCGCCCGGGCGGCGCCGGGCGGGCCGGGGCGGGCCCCCGCGCCGGCCCGGGGGCGGGCGCGC\
GGGCCGGCCGGGGGCGGGCGGGGGGCCCCGGCCCGCCCGGCGCCCCGCGGCGCCCCCGGGGGCGGGCGGGGCGCCCCGC\
GGCCCGGGGCGGGGCCGCCCCGCGGGGCGGGCCCGCGCCGCCCCCCCCGCGGGCGGCCCGGCGCGCCGGGGGGGCGGGG\
CCGGCCCGGGCGGCGGCCGCGGGCCGGGGGGGCGGGGCGCCGCCCGGGGGGCGGGCCCGGCGGCGCGCGGCCCGGCCGC\
CCGCCCGCCGCCCGGGCCGCGCGGGGGCCCCCGGCGCCCGCGCGCCCGGCCCCGGGGCCCGCCCCGGCGCGCGGGCCCG\
GGCCGGGGCGGGGCCGCCGGCGCCCGGGGCCGGGGGGGCCCGGCGCCCCGGCCGGCCCCGGCGCGCGCCGCCGCGGGCG\
GCCGGCGGGGGGCCCGCGCCGGGGGGGCGGGCCGCCGCGCGCCGGGGGCGGCGCCGGCCGGCGGGGGCGCCCGGCGCGG\
CGGGGGCGCCGGGCCCGCGCGGGGGCGGCGCCCCCGCCCCGGCGGGCCGGGGCGCGGCGCCGGGGCCGCCCCCCGGGCG\
CCCGGGGCGGGGCCCGCCGCGGCCCCCGGGCCCGGCGCGCCCGCGCCCGCGGCGCGCGCGCCCGGGGGCGGGGGCCGGG\
CCCGGCCCGCGCCCCGGCGCGCGGCGCGGCGGCGCGGGCGCGGCGGGCCCCGCCCGCGCCCCCCGCGCGCCGGGCCGGC\
CCCCGCGGGGCGCGGCGGCGCGCGGGCGGCCGGCGGCCGGCCGCCGCGCGCCCGCCGCGGCGCCGGGCGGCCCGGGCCG\
GGGCGGCGGGGCCCGCGGCGCGCGGCCCGCCGCGCCCCGCCCCGGCCGGCGGGCCGCGGCCGGCCGCCGGCCGCGCCGC\
CGCCCCCCGGGCGCCCCGGCGCGGCGGCCGCGGGGGGCCCGCGGGGCGCGGCCGCGGCCCGCCCGGCCGCGCCCGGGGG\
CGGGGGCCCGCCCCCGCCCGCGCGCCCGCCCGCCCGCCGCCCGCCCCCGGGGGCCGGGCGGGCCGCGGGGCGCGGGGGG\
GGCCCCCGGCCCCCCCGCGGGGCGCCGGCCCCCCCCCCGGCGGGGCGCCCCGCCCGGGCGCGGCGGCGGGCGCGCCCCC\
CGGGCCGCGCCGCCCCCCGCCCCCGCCGGGGCCCGCCGCCGGCGGCCGGGGCCGCCGCCCCGCGGCGGGCCCCCCGCCC\
GCGCCCCCCCGCGCCGGGCCGCCCGGCGGGCGGCCGGCCCGGCCCGCCCCGCGGGGCCGCGGCCGCGCGGGCCGGGGCC\
CCGGGCCGGGCCGCGCGGCCGGGCCCGGCCCCGCCCCGGCGGCCGCGGGCCCCGGCCCGCCCGGGCGGCGCGGCCGGCC\
GGGGCCGCGCGGGGCGCCGGCCGCGGGCCCCCCCCCGGGCGCGGCCCCCCCGCCCGGCGGCGCGCGGCCGCCGCCGCCG\
CCGGCCGGCCCGGCGGGCGGCGCCGCCGCCGCGGGCCCGGCGCGCCCCCCCCGCGGGCGCGGGGCCGCCCGGCCCCGCG\
CCGCGGCCCCGCGGCGGGGCCGGCGGGCCGCGCCCCGGGCGGCGCCGGGGGCCCGCGGCGCGCGCGCCCCGGCGCGGCG\
CGCGCGCGCCCCGGCCGCCGCCCCGCGCCGGGGGCCCGGCCGCGCGCCGCGCCGGCGCGCCCGCGCCGCCCGGGGGGGG\
CGCGCGGGGCGGGCGGCCCGGCCGGGGCGCCGCCGCGCCGGCGCGCGCCCGCCCGCCGCCGGCCGCCGGCGCGCGGGCG\
GCGCCGCGGGCCGCCGGCCCCGGCCCCCCCGCCCCCGGCGCCGCGCGCCGGGCGGCGCGGGCCCGGGCCGGCCCCGCGG\
CGGCGCCCGCCGGCCGGCGGGGGGGCCGGGGGCCCGCCGGGCCGCGCCGCCGGGGCCCCCCGGGCGCCCCGCGCCGGCG\
CCGGGCGGGCCGGCGCGCGCCCCCCCCCCCGGGGGCGCGCGGCCGCGCGGGCGGGCGCGCGGCGCGCGCGCCCGCCCGG\
CGCGCCCGGCCCCCCGCGCCCCCCCCGGGGGCCGGGGGGGCGCCCCGCGCCCGGGCGGGCGGCGGCCCCGCGGGGCGGG\
CCCGCGCCGCCGCCCGCGCGGGGGGGCCGGGGCCGCCGGGGGCGGGGGCGGCCCCGGGCCCCGGCCGCCGGCCCCGGCG\
GGGGGGCCCCGCCCGGGGGGCGGGCGCCGGCCGGCGCGGCCCGGCGGGGCGCCCGGGGGCCGGGCCGGGCCGGGCGGCC\
CGGCGCCGGCGCGCCCGGGCCCGGGGCCCGGCGCGGCGCGCCGGCCGGGGGCGGGCCGGGGGCGCGGGCCCCCGGGGCC\
GGGCGGGCCCGCCGCGCCGGCCGGCCCCGGCGGGCCGCGCGGGCGGCGCCCCGGGGGGGGCCCGCGGGGGGGGGGCGGG\
CCGCCGCCCGCCGCCGCCGGCGGCGGCCGGCCGCGCCCCCCGCCGCCGCGGCCGCGCCCGGGCCGCGCGGCGGGGGCGG\
CCGCGCCCCGGCGGGCCGGCGCGCCGCCCCGGGGCGCCGCCCCGGCCGCCCGCCGCCGGGCCCGCCGCGGCCCCCGGGC\
GCCGCGCGCGCGGGGCCGGGCCGCGCGCGCGCCGGGCCGCCGGCGGGGCGCGGCC";

#[bench]
fn bench_hamming_dist_equal_str_1000iter(b: &mut Bencher) {
    b.iter(|| {
        for _ in 0..1000 {
            black_box(hamming(STR_1, STR_1));
        }
    });
}

#[bench]
fn bench_hamming_dist_diverse_str_1000iter(b: &mut Bencher) {
    b.iter(|| {
        for _ in 0..1000 {
            black_box(hamming(STR_1, STR_2));
        }
    });
}

#[bench]
fn bench_levenshtein_dist_equal_str(b: &mut Bencher) {
    b.iter(|| levenshtein(STR_1, STR_1));
}

#[bench]
fn bench_levenshtein_dist_diverse_str(b: &mut Bencher) {
    b.iter(|| levenshtein(STR_1, STR_2));
}

#[bench]
fn bench_levenshtein_dist_worst_str(b: &mut Bencher) {
    b.iter(|| levenshtein(STR_3, STR_4));
}

// SIMD-accelerated edit distance routines below

#[bench]
fn bench_simd_hamming_dist_equal_str_1000iter(b: &mut Bencher) {
    b.iter(|| {
        for _ in 0..1000 {
            black_box(simd::hamming(STR_1, STR_1));
        }
    });
}

#[bench]
fn bench_simd_hamming_dist_diverse_str_1000iter(b: &mut Bencher) {
    b.iter(|| {
        for _ in 0..1000 {
            black_box(simd::hamming(STR_1, STR_2));
        }
    });
}

#[bench]
fn bench_simd_levenshtein_dist_equal_str(b: &mut Bencher) {
    b.iter(|| simd::levenshtein(STR_1, STR_1));
}

#[bench]
fn bench_simd_levenshtein_dist_diverse_str(b: &mut Bencher) {
    b.iter(|| simd::levenshtein(STR_1, STR_2));
}

#[bench]
fn bench_simd_levenshtein_dist_worst_str(b: &mut Bencher) {
    b.iter(|| simd::levenshtein(STR_3, STR_4));
}

#[bench]
fn bench_simd_bounded_levenshtein_dist_equal_str(b: &mut Bencher) {
    b.iter(|| simd::bounded_levenshtein(STR_1, STR_1, u32::MAX));
}

#[bench]
fn bench_simd_bounded_levenshtein_dist_diverse_str(b: &mut Bencher) {
    b.iter(|| simd::bounded_levenshtein(STR_1, STR_2, u32::MAX));
}

#[bench]
fn bench_simd_bounded_levenshtein_dist_worst_str(b: &mut Bencher) {
    b.iter(|| simd::bounded_levenshtein(STR_3, STR_4, u32::MAX));
}
